// 云函数模板
// 部署：在 cloud-functions/join_activity 文件夹右击选择 “上传并部署”

const cloud = require('wx-server-sdk');

// 初始化 cloud
cloud.init({
    // API 调用都保持和云函数当前所在环境一致
    env: cloud.DYNAMIC_CURRENT_ENV,
});

/**
 * 这个示例将经自动鉴权过的小程序用户 openid 返回给小程序端
 *
 * event 参数包含小程序端调用传入的 data
 *
 */
exports.main = async (event, context) => {
    console.log('[join_activity event]:', event);
    console.log('[join_activity context]:', context);

    // 可执行其他自定义逻辑
    // console.log 的内容可以在云开发云函数调用日志查看

    // 获取 WX Context (微信调用上下文)，包括 OPENID、APPID、及 UNIONID（需满足 UNIONID 获取条件）等信息
    const wxContext = cloud.getWXContext();

    const db = cloud.database();
    const _ = db.command;

    const {activityId, userId} = event;

    if (!activityId) {
        throw '无有效activityId';

        return;
    }

    if (!userId) {
        throw '无有效userId';

        return;
    }

    const existJoiners = await db.collection('activity').where({
        _id: activityId,
        'joiners.id': userId
    }).get();

    if (existJoiners.data && existJoiners.data.length) {
        // 存在的话 更新格子状态
        await db.collection('activity')
            .where({
                _id: activityId,
                'joiners.id': userId
            }).update({
                data: {
                    'joiners.$.quit': false,
                    'joiners.$.score': 0
                }
            });

        await db.collection('user').where({
            _id: userId,
            'activities.id': activityId
        }).update({
            data: {
                'activities.$.quit': false,
                'activities.$.score': 0
            }
        })
    } else {
        // 加入活动，update 活动的 joiners
        await db
            .collection('activity')
            .doc(event.activityId)
            .update({
                data: {
                    joiners: _.push({id: event.userId, score: 0}),
                },
            });

        // 加入活动，update 用户的 activities
        await db
            .collection('user')
            .doc(event.userId)
            .update({
                data: {
                    activities: _.push({
                        id: event.activityId,
                        seasonId: event.seasonId,
                        time: new Date().getTime(),
                        score: 0,
                    }),
                },
            });
    }
    return {
        status: 0,
    };
};
